Redis从出门到高可用--Redis API的使用与理解

Redis从出门到高可用–Redis API的使用与理解

一、通用命令

1.1、通用命令

keys * :所有key

1
2
3
4
5
6
7
8
127.0.0.1:6382> set k1 v1
OK
127.0.0.1:6382> set k2 v2
OK
127.0.0.1:6382> keys *
1) "k1"
2) "k2"
127.0.0.1:6382>

keys [..]

dbsize:数据库中key的总数

1
2
3
127.0.0.1:6382> dbsize
(integer) 2
127.0.0.1:6382>

exists key:key是否存在

1
2
3
127.0.0.1:6382> exists k1
(integer) 1
127.0.0.1:6382>

del key [key …]:删除key-value

1
2
3
4
5
6
127.0.0.1:6382> del k1
(integer) 1
127.0.0.1:6382>
127.0.0.1:6382> keys *
1) "k2"
127.0.0.1:6382>

expire key seconds:设置过期时间

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
127.0.0.1:6382> set k1 v1 
OK
127.0.0.1:6382> set k2 v2
OK
127.0.0.1:6382> expire k1 10
(integer) 1
127.0.0.1:6382> ttl k1
(integer) 6
127.0.0.1:6382> ttl k1
(integer) 4
127.0.0.1:6382> ttl k1
(integer) 3
127.0.0.1:6382> ttl k1
(integer) 2
127.0.0.1:6382> ttl k1
(integer) 1
127.0.0.1:6382> ttl k1
(integer) -2
127.0.0.1:6382>

ttl:查看过期时间

persis key:去掉过期时间

type key:返回key的类型

1
2
3
127.0.0.1:6382> type k2
string
127.0.0.1:6382>

1.2、数据结构和内部编码

image

1.3、单线程架构

image

单线程为什么还这么快?
(1)、redis是纯内存的
(2)、redis是非阻塞式IO
(3)、避免线程切换和竞态消耗
单线程需要注意什么?
(1)、一次只运行一条命令
(2)、拒绝长(慢)命令(keys flushall slow lua script mutil/exec operate big value(collection))
(3)、其实并不是单线程

二、字符串类型

2.1、结构命令

get 获取值

时间复杂度: O(1)

set 设置值 O(1)

del O(1)

incr 自增(线程安全)

decr

incrby

decrby

2.2、快速实战

做计数器

缓存视频的基本信息

分布式的id生成器
image

set:无论key是否存在都设置

setnx:key存在才设置

setxx:key存在才设置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
127.0.0.1:6382> exists php
(integer) 0
127.0.0.1:6382> set php good
OK
127.0.0.1:6382> set php bad
OK
127.0.0.1:6382> setnx php best
(integer) 0
127.0.0.1:6382> get php
"bad"
127.0.0.1:6382> exists java
(integer) 0
127.0.0.1:6382> setnx java good
(integer) 1
127.0.0.1:6382> set java easy xx
OK
127.0.0.1:6382> get java
"easy"

mget:批量获取 O(n)

mset批量设置 O(n)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
127.0.0.1:6382> mset k3 3 k4 4 k5 5
OK
127.0.0.1:6382> get k3
"3"
127.0.0.1:6382> get k4
"4"
127.0.0.1:6382> get k5
"5"
127.0.0.1:6382>
127.0.0.1:6382> mget k3 k4 k5
1) "3"
2) "4"
3) "5"
127.0.0.1:6382>
2.3、内部编码
2.4、查缺补漏
getset key newvalue: 返回旧值,设置新值

append key value:将value追加到旧值

strlen key:返回字符串的长度
incrbyfloat key 3.5
getrange key start end
setrange key index value

三、哈希类型

3.1、特点
key filed value

例如:
key:表名

filed:属性

value:属性值

filed不能相同

3.2、重要API
hget  key filed

hset  key filed value

hdel  key filed
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
127.0.0.1:6382> hset user:1:info age 23
(integer) 1
127.0.0.1:6382> hget user:1:info age
"23"
127.0.0.1:6382> hset user:1:info name cluo
(integer) 1
127.0.0.1:6382> hgetall user:1:info
1) "age"
2) "23"
3) "name"
4) "cluo"
127.0.0.1:6382> hdel user:1:info age
(integer) 1
127.0.0.1:6382> hgetall user:1:info
1) "name"
2) "cluo"
127.0.0.1:6382>
hexists
hlen
hmget
hmset
1
2
3
4
5
6
7
8
9
10
11
12
127.0.0.1:6382> hexists user:1:info name
(integer) 1
127.0.0.1:6382> hexists user:1:info age
(integer) 0
127.0.0.1:6382> hmset user:2:info age 30 name kaka page 50
OK
127.0.0.1:6382> hlen user:2:info
(integer) 3
127.0.0.1:6382> hmget user:2:info age name
1) "30"
2) "kaka"
127.0.0.1:6382>
O(n)
hgetall key:返回hash key对应所有的field 和 value(小心使用)
hvals key:返回hash key 对应所有field的value
hkeys key:返回hash key对应所有field
3.3、string|hash
string hash
get hget
set setnx hset hsetnx
del hdel
incr incrby decr decrby hinc hdecr hincrby hincr
mset hmset
mget hmget
3.4、实战

实现如下功能:

记录每个人主页访问量?
hincrby user:1:info pageview count
缓存视频的基本信息?

四、列表类型

key elements
user:1:message   a b c d e f 
4.1、特点
有序

可重复

左右两边插入弹出
4.2、重要API

rpush

rpush key v1 v2 v3...Vn:从列表右端插入值(1~N个)

rpush listkey c b a 
c--->b--->a

lpush

lpush key v1 v2 v3...Vn:从列表左边插入值(1~N个)

lpush listkey c b a 
a<---b<---c

linsert

linsert key before|after value newValue:在list指定的值前|后插入newValue

a---b---c---d
 linsert listkey before b java
 a---java---b---c---d

 linsert listKey after b php
 a---b---php---c---d

lpop

lpop:从列表左边弹出一个item

a--b--c--d
lpop listKey
--b--c--d

rpop

a--b--c--d
rpop listKey
a--b--c--

lrem

lrem key count value
#根据count值,从列表中删除所有与value相等的项
(1)、count>0,从左到右,删除最多count个value相等的项
(2)、从右到左,删除最多Math.abs(count)个value相等的项
(3)、count=0,删除所有value相等的项

a---c---a---c---b---f
lrem listkey 0 a
 ---c---c----b---f

 lrem listkey -1 c
 a---c---a---b---f

ltrim

ltrim key start end:按照索引范围修剪列表

a---b---c---d---e---f

ltrim listkey 1  4
---b---c---d---e

lrange

lindex

lindex key index:获取列表指定索引的值

lset

lset key index newValue:设置列表指定索引为newValue
4.3、实战
4.4、查缺补漏

blpop

blpop key timeout:lpop阻塞版本,timeout是阻塞超时时间,timeout=0表示永不阻塞

brpop

与blpop同理

五、集合类型

5.1、特点

不允许重复

无序

支持集合间的操作

5.2、集合内API和实战

sadd

sadd key elements:添加

srem

srem key element:删除

scard sismember srandmember smembers

scard user:1:follow   = 4  #计算集合大小
sismember user:1:follow it   =1#判断it是否存在集合中
srandmember user:1:follow count  =his#从集合挑选count个元素,不会破坏原集合
spop user:!:follow  =sports#从集合中随机弹出一个元素
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
127.0.0.1:6382> sadd user:1:follow it new his sports
(integer) 4
127.0.0.1:6382> smembers user:1:follow
1) "sports"
2) "his"
3) "new"
4) "it"
127.0.0.1:6382> spop user:1:follow
"new"
127.0.0.1:6382> smembers user:1:follow
1) "sports"
2) "his"
3) "it"
127.0.0.1:6382> scard user:1:follow
(integer) 3
127.0.0.1:6382> sismember user:1:follow entertainment
(integer) 0
127.0.0.1:6382>

微博抽奖

给用户添加标签

5.3、集合间API和实战

sdiff sinter sunion:差、交、并


六、有序集合类型

key score value

user:ranking 1 james
6.1、特点

无重复元素

有序

element+score

6.2、重要API

zadd

zadd key score element:添加score和element  O(logN)

zrem

1
rem key element:删除元素

zscore

zscore key element:返回元素分数

zinsrby

zincrby key increScore element:增加或减少元素分数

zincrby user:1:ranking 9 mike

zcard:

zcard key :返回元素个数

zrange

zrange key start end [WITHSCORES]
6.3、实战
排行版
6.4、查缺补漏
zrevrank

zrevrange
文章目录
  1. 1. 一、通用命令
    1. 1.0.1. 1.1、通用命令
    2. 1.0.2. 1.2、数据结构和内部编码
    3. 1.0.3. 1.3、单线程架构
  • 2. 二、字符串类型
    1. 2.0.0.0.1. 2.1、结构命令
    2. 2.0.0.0.2. 2.2、快速实战
    3. 2.0.0.0.3. 2.3、内部编码
    4. 2.0.0.0.4. 2.4、查缺补漏
  • 3. 三、哈希类型
    1. 3.0.0.0.1. 3.1、特点
    2. 3.0.0.0.2. 3.2、重要API
    3. 3.0.0.0.3. 3.3、string|hash
    4. 3.0.0.0.4. 3.4、实战
  • 4. 四、列表类型
    1. 4.0.0.0.1. 4.1、特点
    2. 4.0.0.0.2. 4.2、重要API
    3. 4.0.0.0.3. 4.3、实战
    4. 4.0.0.0.4. 4.4、查缺补漏
  • 5. 五、集合类型
    1. 5.0.0.0.1. 5.1、特点
    2. 5.0.0.0.2. 5.2、集合内API和实战
    3. 5.0.0.0.3. 5.3、集合间API和实战
  • 6. 六、有序集合类型
    1. 6.0.0.0.1. 6.1、特点
    2. 6.0.0.0.2. 6.2、重要API
    3. 6.0.0.0.3. 6.3、实战
    4. 6.0.0.0.4. 6.4、查缺补漏